package com.dxf.chepter05

/**
 * scala超类和java有点不同
 * 1 scala有1个主构造器和多个辅构造器,每个构造器都必须先调用主构造器
 *
 * 2 调用子类要调用父类的主构造器,并传入参数可以 class A (name:String) extends B(name)
 *
 *
 */
object T58_超类分析 {
  def main(args: Array[String]): Unit = {

    /**
     * 执行流程
     *  1 B继承A,先执行A的主构造器 printLn("A")
     *  2 创建B, 执行主构造器 printLn("B")
     *
     */
   // val b = new B1()


    /**
     * 执行流程
     *  1 B继承A,先执行A的主构造器 printLn("A")
     *  2 执行B的辅助构造器 def this(name: String)
     *  3 执行辅助构造器内的 this() -->即执行主构造器 printLn("B")
     *  4 执行 println("name="+this.name) 语句,name继承自A,所以name ="A"
     *  5 执行  this.name = name  ,所有B1的name ="tom"
     *  6 执行    println("辅助构造器")  打印 辅助构造器
     *  7 执行 println("name="+this.name)语句,name从A 变为 tom
     */
    val b2 = new B1("tom");


  }
}

class A1() {
  var name = "A"
  println("A")
}

class B1() extends A1() {
  println("B")

  def this(name: String) {
    this //调用主构造器
    println("name="+this.name)
    this.name = name
    println("辅助构造器")
    println("name="+this.name)

  }
}
